iT邦幫忙

2024 iThome 鐵人賽

DAY 14
0
自我挑戰組

Unity入門遊戲開發與實作系列 第 14

【Day 14】製作一個簡單 Unity 小遊戲(三)鍵盤控制和第三人稱視角

  • 分享至 

  • xImage
  •  

昨天讓方塊可以平穩的在地面上滑行,今天我們終於要來加入鍵盤控制按鍵了!使用鍵盤上的 ad 來操控物體的左右來閃避障礙物!
繼續上次的程式碼,並且在程式碼中新增檢測鍵盤按鍵的程式碼,

// PlayerMovement.cs
using UnityEngine;

public class PlayerMovement : MonoBehaviour
{
    // Start is called before the first frame update
    public Rigidbody Rb;
    public folat forwardForce = 2000;
    
    // Update is called once per frame
    void FixedUpdate()
    {
		rb.AddForce(0, 0, forwardForce * Time.deltaTime);
		if( Input.GetKey("d") )
		{
			rb.AddForce(500 * Time.deltaTime, 0, 0);
		}
		if( Input.GetKey("a") )
		{
			rb.AddForce(-500 * Time.deltaTime, 0, 0);
		}
    }
}

其中,Input.GetKey() 可以檢測輸入的鍵盤按鍵,如果檢測到的按鍵是 ad ,那就施予這個 Player 不同方向的力。
回到遊戲的 Game 面板按下 Play 之後就可以操控我們的方塊了!
https://ithelp.ithome.com.tw/upload/images/20240928/20169301uDgXXIplzW.png
https://ithelp.ithome.com.tw/upload/images/20240928/20169301MdaH9HYXIl.png
https://ithelp.ithome.com.tw/upload/images/20240928/20169301WHkGyi73XO.png
真是太棒了!但是現在的相機視角並不會跟著玩家移動,我們需要把相機綁定到方塊上面,讓方塊移動的時候相機也跟著移動。想要達成這個效果有幾個方法:

  1. 直接將相機綁定到 Player 身上
    這個方法非常簡單直接,只要在 Hierarchy 面板中把相機拖曳到 Player 中就好了
    https://ithelp.ithome.com.tw/upload/images/20240928/20169301r4uAGhC9w1.png
    但這個方法有一個壞處,就是當我們的 Player 發生碰撞或是傾斜的時候,我們的相機也會隨之晃動
    https://ithelp.ithome.com.tw/upload/images/20240928/20169301xM4qATcPIe.png
    這雖然像是第一人稱的遊戲視角,但並不是我們這個遊戲中想要的
  2. 使用程式控制
    這個方法是用程式來讓相機每一幀都重新定位到 Player 身上,由於只是位子重疊,所以 Player 的方向和相機的方向並沒有有關係,這樣就不會造成相機隨著碰撞而轉動的問題了

因此,我們需要為 Main Camera 創立新的腳本。在 Script 資料夾中創建並取名為 FollowPlayer 然後將這個腳本拖曳到 Main CameraInspector 視窗中

// FollowPlayer.cs
using UnityEngine;

public class FollowPlayer : MonoBehaviour
{
    public Transform player;
    // Update is called once per frame
    void Update()
    {

    }
}

因為我們需要取用 Player 的位子好讓我們的相機能夠定位到上面,而控制位子這方面的 Component 就叫做 Transformplayer 則是這支程式對 public Transform 這個資料型態所設的變數。
加上了 public Transform player; 之後回到 Unity ,我們要將 Hierarchy 中的 Player 拖拉進這個方框中
https://ithelp.ithome.com.tw/upload/images/20240928/201693012tSulVi0q1.png
我們試著在 Update() 函式裡印出位子

// FollowPlayer.cs
using UnityEngine;

public class FollowPlayer : MonoBehaviour
{
    public Transform player;
    // Update is called once per frame
    void Update()
    {
		Debug.Log(player.position);
    }
}

並執行
https://ithelp.ithome.com.tw/upload/images/20240928/20169301XwwqbkiLfN.png

當方塊一邊前進的時候,一邊輸出該方塊的座標位置

接下來我們把相機定位到方塊上

// FollowPlayer.cs
using UnityEngine;

public class FollowPlayer : MonoBehaviour
{
    public Transform player;
    // Update is called once per frame
    void Update()
    {
		transform.position = player.position;
    }
}

這裡的 transform 指的是自身物件的 transform Component( Main Camera
執行看看遊戲
https://ithelp.ithome.com.tw/upload/images/20240928/20169301vWtPRQpkDA.png
發現相機的確跟著方塊前進了!但是我們希望視角要再向後一點,能看到整個方塊,而不是第一人稱,為了解決這個問題,要再引入一個 Vector3

// FollowPlayer.cs
using UnityEngine;

public class FollowPlayer : MonoBehaviour
{
    public Transform player;
    public Vector3 offset;
    // Update is called once per frame
    void Update()
    {
		transform.position = player.position;
    }
}

Vector3 裡面儲存了三個浮點數,在調整位子時特別好用。
https://ithelp.ithome.com.tw/upload/images/20240928/20169301N9k2a0HURq.png
我們多了三個可調整的欄位。對他進行調整可以看到 Main Camera 也在改變,調整到一個適合的位子後(例如 x = 0, y = 1, z = -5),將這組數字加到原本的位子上

// FollowPlayer.cs
using UnityEngine;

public class FollowPlayer : MonoBehaviour
{
    public Transform player;
    public Vector3 offset;
    // Update is called once per frame
    void Update()
    {
		transform.position = player.position + offset;
    }
}

執行遊戲
https://ithelp.ithome.com.tw/upload/images/20240928/20169301gULeNv9Nmj.png
https://ithelp.ithome.com.tw/upload/images/20240928/20169301axrleikYm0.png
如此一來每次相機更新的位子就是 Player 的位子再加上 offset 的值,就可以實現類似第三人稱的視角了!並且不論 Player 如何碰撞,相機視角都不會跟著改變,明天要來在這個賽道上創建一些障礙物,讓玩家閃避,並且做出碰撞檢測,來讓我們知道 Player 何時撞到了這些障礙物。


上一篇
【Day 13】製作一個簡單 Unity 小遊戲(二)角色前進
下一篇
【Day 15】製作一個簡單 Unity 小遊戲(四)物體碰撞檢測
系列文
Unity入門遊戲開發與實作30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言